package com.xbongbong.workflow.pojo.nodes;

import com.alibaba.fastjson.JSONArray;
import com.xbongbong.paas.domain.entity.ext.FieldPermissionEntityExt;
import com.xbongbong.paas.domain.entity.ext.OptionalRangeEntity;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @author chenpeng
 * @version 1.0
 * @date 2021-05-10 14:58
 * @description 审批节点
 */
@Getter
@Setter
@ToString
public class ApprovalNode implements Serializable {
    private static final long serialVersionUID = -3077390009135494064L;
    /**
     * 字段权限
     */
    @Valid
    private Map<String, FieldPermissionEntityExt> fieldPermission;
    /**
     * 节点负责人
     */
    @Valid
    @NotEmpty(message = "{dto.msg.ApprovalNode.mainUser.NotEmpty}")
    private List<OptionalRangeEntity> mainUserList;
    /**
     * 流程节点是否启用抄送，如果启用，则抄送人保存在 ccUserList 中
     */
    private Integer enableCcFlag;

    /**
     * 节点抄送人
     */
    @Valid
    private List<OptionalRangeEntity> ccUserList;
    /**
     * 是否必填审批意见
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.opinionFlag.NotNull}")
    private Integer opinionFlag;
    /**
     * 是否开启提交（1：开启；0：不开启）
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.commitFlag.NotNull}")
    private Integer commitFlag;
    /**
     * 提交文案
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.commitText.NotNull}")
    private String commitText;
    /**
     * 是否开启暂存（1：开启；0：不开启）
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.storageFlag.NotNull}")
    private Integer storageFlag;
    /**
     * 暂存文案
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.storageText.NotNull}")
    private String storageText;
    /**
     * 是否开启提交并打印（1：开启；0：不开启）
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.commitPrintFlag.NotNull}")
    private Integer commitPrintFlag;
    /**
     * 提交并打印文案
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.commitPrintText.NotNull}")
    private String commitPrintText;
    /**
     * 是否开启回退（1：开启；0：不开启）
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.backFlag.NotNull}")
    private Integer backFlag;
    /**
     * 回退类型 0 上一节点 1：所选节点
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.backType.NotNull}")
    private Integer backType;
    /**
     * 回退文案
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.backText.NotNull}")
    private String backText;
    /**
     * 回退节点[{"nodeId": xx},{"nodeId": xx}]
     */
    private String backNode;
    /**
     * 是否开启转交（1：开启；0：不开启）
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.transferFlag.NotNull}")
    private Integer transferFlag;
    /**
     * 转交文案
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.transferText.NotNull}")
    private String transferText;
    /**
     * 转交人
     */
    private List<OptionalRangeEntity> transferUserList;
    /**
     * 是否开启结束流程（1：开启；0：不开启）
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.endFlag.NotNull}")
    private Integer endFlag;
    /**
     * 结束流程文案
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.endText.NotNull}")
    private String endText;

    /**
     * 是否开启加签，（0，未开启，1开启）
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.addSignatureFlag.NotNull}")
    private Integer addSignatureFlag;

    /**
     * 加签文案
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.addSignatureText.NotNull}")
    private String addSignatureText;

    /**
     * 节点提交验证，1所有数据均可提交，2满足条件的数据才可提交，具体条件参考验证条件字段
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.commitVerifyFlag.NotNull}")
    private Integer commitVerifyFlag;
    /**
     * 节点提交验证条件
     * 这是暂时无用
     */
    private JSONArray commitVerifyCondition;
    /**
     * 会签/或签，1或签(任意负责人提交后进入下一节点), 2会签(所有负责人提交后进入下一节点)
     */
    @NotNull(message = "{dto.msg.processTemplateNodeUpdate.signType.NotNull}")
    private Integer signType;
    /**
     * 超时处理
     */
    private String timeoutHandle;
    /**
     * 打印模板id/抄送打印模板id
     */
    private Long printTemplateId;
    /**
     * 是否开启抄送打印（1：开启；0：不开启）
     */
    private Integer ccPrintFlag;
    /**
     * 标题
     */
    @NotEmpty(message = "{dto.msg.ApprovalNode.title.NotEmpty}")
    private List<WorkflowTitlePojo> title;

    public ApprovalNode() {
    }

    public ApprovalNode(@Valid Map<String, FieldPermissionEntityExt> fieldPermission, List<OptionalRangeEntity> mainUserList, Integer enableCcFlag,
                        List<OptionalRangeEntity> ccUserList, Integer opinionFlag, Integer commitFlag, String commitText, Integer storageFlag, String storageText,
                        Integer commitPrintFlag, String commitPrintText, Integer backFlag, Integer backType, String backText, String backNode, Integer transferFlag,
                        String transferText, List<OptionalRangeEntity> transferUserList, Integer endFlag, String endText, Integer commitVerifyFlag, JSONArray commitVerifyCondition,
                        Integer signType, String timeoutHandle, Long printTemplateId, Integer ccPrintFlag, List<WorkflowTitlePojo> title) {
        this.fieldPermission = fieldPermission;
        this.mainUserList = mainUserList;
        this.enableCcFlag = enableCcFlag;
        this.ccUserList = ccUserList;
        this.opinionFlag = opinionFlag;
        this.commitFlag = commitFlag;
        this.commitText = commitText;
        this.storageFlag = storageFlag;
        this.storageText = storageText;
        this.commitPrintFlag = commitPrintFlag;
        this.commitPrintText = commitPrintText;
        this.backFlag = backFlag;
        this.backType = backType;
        this.backText = backText;
        this.backNode = backNode;
        this.transferFlag = transferFlag;
        this.transferText = transferText;
        this.transferUserList = transferUserList;
        this.endFlag = endFlag;
        this.endText = endText;
        this.commitVerifyFlag = commitVerifyFlag;
        this.commitVerifyCondition = commitVerifyCondition;
        this.signType = signType;
        this.timeoutHandle = timeoutHandle;
        this.printTemplateId = printTemplateId;
        this.ccPrintFlag = ccPrintFlag;
        this.title = title;
    }
}
